<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>preventExtensions()</title>
</head>
<body>
  <script>
    /**
     * preventExtensions()方法拦截Object.preventExtensions()。该方法必须返回一个布尔值
     * 否则会被自动转为布尔值。
     * 这个方法有一个限制。只有目标对象不可扩展时(即Object.isExtensible(proxy)为false)
     * prxoy.preventExtensions()才能返回true, 否则会报错
    */
   var proxy = new Proxy({}, {
     preventExtensions: function(target) {
      // return true
      console.log('called');
      Object.preventExtensions(target);
      return true
     }
   })
   // 阻止扩展
   var a = Object.preventExtensions(proxy)
   console.log(a) //Proxy {}
   a.value = 'hello'
   console.log('a', a) //Proxy {} 成功阻止了目标对象的扩展
   // 'preventExtensions' on proxy: trap returned truish but the proxy target is extensible
   // 代理上的这个方法捕捉 true, 但是目标对象是可扩展的
   // 上面代码中，proxy.preventExtensions()方法返回true，但这时Object.isExtensible(proxy)会返回true，因此报错。
   // 为了防止出现这个问题，通常要再proxy.preventExtensions()方法里，调用一次Object.preventExtensions()
  </script>
</body>
</html>